home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / APPEXPRT.PAK / APXPREV.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  10KB  |  358 lines

  1. //----------------------------------------------------------------------------
  2. ##@QUERY_PRJ_NAME [[Project]]
  3. //  Project [[Project]]
  4. ##@QUERY_PRJ_COMPANY [[CompanyName]] 2
  5. ##@QUERY_PRJ_COPYRIGHT [[Copyright]] 2
  6. ##\\Copyright Copyright 2
  7. //  [[CompanyName]]
  8. //  [[Copyright]]
  9. //
  10. ##@QUERY_TARGET_NAME [[Target]]
  11. //  SUBSYSTEM:    [[Target]] Application
  12. //  FILE:         apxprev.cpp
  13. ##@QUERY_PRJ_USER [[Author]]
  14. //  AUTHOR:       [[Author]]
  15. //
  16. //  OVERVIEW
  17. //  ~~~~~~~~
  18. //  Source file for implementation of Print Preview.
  19. //
  20. //----------------------------------------------------------------------------
  21. #include <owl/pch.h>
  22.  
  23. #include <owl/buttonga.h>
  24. #include <owl/textgadg.h>
  25. #include <stdio.h>
  26.  
  27. #include "apxprev.h"
  28. ##<<TApplication QUERY_FILENAME_CPP [[FileName]]
  29. #include "[[FileName]].rh"
  30.  
  31.  
  32. //{{TApxPreviewWin Implementation}}
  33.  
  34. DEFINE_RESPONSE_TABLE1(TApxPreviewWin, TDecoratedFrame)
  35.   EV_COMMAND_ENABLE(APX_PPR_PREVIOUS, PPR_PreviousEnable),
  36.   EV_COMMAND_ENABLE(APX_PPR_NEXT, PPR_NextEnable),
  37.   EV_COMMAND(APX_PPR_PREVIOUS, PPR_Previous),
  38.   EV_COMMAND(APX_PPR_NEXT, PPR_Next),
  39.   EV_COMMAND(APX_PPR_ONEUP, PPR_OneUp),
  40.   EV_COMMAND_ENABLE(APX_PPR_TWOUP, PPR_TwoUpEnable),
  41.   EV_COMMAND(APX_PPR_TWOUP, PPR_TwoUp),
  42.   EV_COMMAND(APX_PPR_DONE, PPR_Done),
  43. ##@QUERY_APPL_MODEL == VALUE_MDI 2
  44.   EV_COMMAND(CM_FILEPRINT, CmPrint),
  45.   EV_COMMAND_ENABLE(CM_FILEPRINT, CmPrintEnable),
  46. //{{TApxPreviewWinRSP_TBL_BEGIN}}
  47. ##:DBResponse(\\"TApxPreviewWin", "", "", "WM_CLOSE", "")
  48.   EV_WM_CLOSE,
  49. //{{TApxPreviewWinRSP_TBL_END}}
  50. END_RESPONSE_TABLE;
  51.  
  52.  
  53. TApxPreviewWin::TApxPreviewWin(TWindow* parentWindow, TPrinter* printer,
  54.                                TWindow* currWindow, const char far* title,
  55.                                TLayoutWindow* client)
  56. :
  57.   TDecoratedFrame(parentWindow, title, client)
  58. {
  59.   CurrWindow = currWindow;
  60.   Printer = printer;
  61.   Client = client;
  62.   Page1 = 0;
  63.   Page2 = 0;
  64.   FromPage = 1;
  65.   ToPage = 1;
  66.  
  67.   TPrintDialog::TData& data = Printer->GetSetup();
  68.   PrnDC = new TPrintDC(data.GetDriverName(),
  69.                        data.GetDeviceName(),
  70.                        data.GetOutputName(),
  71.                        data.GetDevMode());
  72.  
  73.   PrintExtent = new TSize(PrnDC->GetDeviceCaps(HORZRES), PrnDC->GetDeviceCaps(VERTRES));
  74.   Printout = new TApxPrintout(Printer, "Print Preview", currWindow, true);
  75.  
  76.   SetBkgndColor(::GetSysColor(COLOR_APPWORKSPACE));
  77.  
  78. ##@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  79.   // Create default toolbar New and associate toolbar buttons with commands.
  80.   //
  81.   PreviewSpeedBar = new TControlBar(this);
  82.   PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_PREVIOUS, APX_PPR_PREVIOUS, TButtonGadget::Command, true));
  83.   PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_NEXT, APX_PPR_NEXT, TButtonGadget::Command, true));
  84.   PreviewSpeedBar->Insert(*new TSeparatorGadget(6));
  85.   PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_ONEUP, APX_PPR_ONEUP, TButtonGadget::Exclusive, true, TButtonGadget::Down));
  86.   PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_TWOUP, APX_PPR_TWOUP, TButtonGadget::Exclusive, true));
  87.   PreviewSpeedBar->Insert(*new TSeparatorGadget(12));
  88.   PreviewSpeedBar->Insert(*new TTextGadget(APX_PPR_CURRPAGE, TGadget::Recessed, TTextGadget::Left, 10, "Page 1"));
  89.   PreviewSpeedBar->Insert(*new TSeparatorGadget(20));
  90.   PreviewSpeedBar->Insert(*new TButtonGadget(CM_FILEPRINT, CM_FILEPRINT, TButtonGadget::Command, true));
  91.   PreviewSpeedBar->Insert(*new TSeparatorGadget(20));
  92.   PreviewSpeedBar->Insert(*new TButtonGadget(APX_PPR_DONE, APX_PPR_DONE, TButtonGadget::Command, true));
  93.   Insert(*PreviewSpeedBar, TDecoratedFrame::Top);
  94.  
  95.   Attr.Style &= ~WS_VISIBLE;
  96.   SetAcceleratorTable(IDM_PRINTPREVIEW);
  97. }
  98.  
  99.  
  100. TApxPreviewWin::~TApxPreviewWin()
  101. {
  102.   delete Page1;
  103.   delete Page2;
  104.  
  105.   delete PrnDC;
  106.   delete PrintExtent;
  107.   delete Printout;
  108. }
  109.  
  110.  
  111. void TApxPreviewWin::SetupWindow()
  112. {
  113.   TDecoratedFrame::SetupWindow();
  114.  
  115.   TAPointer<char> captionText = new char[256];
  116.  
  117. ##@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  118.   // Set the caption of the preview window based on that of the Main Window.
  119.   //
  120.   GetApplication()->GetMainWindow()->GetWindowText(captionText, 256);
  121.   strcat(captionText, " (Preview)");
  122.   SetCaption(captionText);
  123.  
  124. ##@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  125.   // Set the icons of the preview window.
  126.   //
  127. ##@QUERY_APPL_MODEL == VALUE_MDI 2
  128.   SetIcon(GetApplication(), IDI_MDIAPPLICATION);
  129.   SetIconSm(GetApplication(), IDI_MDIAPPLICATION);
  130. ##@QUERY_APPL_MODEL == VALUE_SDI 2
  131.   SetIcon(GetApplication(), IDI_SDIAPPLICATION);
  132.   SetIconSm(GetApplication(), IDI_SDIAPPLICATION);
  133.  
  134.   TPrintDialog::TData& data = Printer->GetSetup();
  135.   Page1 = new TPreviewPage(Client, *Printout, *PrnDC, *PrintExtent, 1);
  136.   Page1->SetPageNumber(1);
  137.   data.MaxPage = 1;
  138.  
  139.   Page2 = 0;
  140.  
  141.   TLayoutMetrics metrics1;
  142.  
  143.   metrics1.X.Set(lmLeft, lmRightOf, lmParent, lmLeft, 15);
  144.   metrics1.Y.Set(lmTop, lmBelow, lmParent, lmTop, 15);
  145.  
  146. ##@QUERY_APPL_COMMENT == VALUE_VERBOSE 3
  147.   // Determine major axis of preview page, have that follow parent size.
  148.   // Make minor axis a percentage (aspect ratio) of the page's major axis
  149.   //
  150.   TRect r = Client->GetClientRect();
  151.   long ratio;
  152.  
  153.   if (PrintExtent->cx > PrintExtent->cy)
  154.     ratio = ((long)PrintExtent->cy * 100) / PrintExtent->cx;
  155.   else
  156.     ratio = ((long)PrintExtent->cx * 100) / PrintExtent->cy;
  157.  
  158.   bool xMajor = ((r.Width() * ratio) / 100) > r.Height();
  159.   if (xMajor){
  160.     metrics1.Height.Set(lmBottom, lmAbove, lmParent, lmBottom, 15);
  161.     metrics1.Width.PercentOf(Page1, (int)((long)PrintExtent->cx * 95 / PrintExtent->cy), lmHeight);
  162.   }
  163.   else {
  164.     metrics1.Height.PercentOf(Page1, (int)((long)PrintExtent->cy * 95 / PrintExtent->cx), lmWidth);
  165.     metrics1.Width.Set(lmRight, lmLeftOf, lmParent, lmRight, 15);
  166.   }
  167.  
  168.   Page1->Create();
  169.  
  170.   Client->SetChildLayoutMetrics(*Page1, metrics1);
  171.   Client->Layout();
  172. }
  173.  
  174.  
  175. void TApxPreviewWin::SpeedBarState()
  176. {
  177. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  178.   // Update the page count.
  179.   //
  180.   TTextGadget* cpGadget = TYPESAFE_DOWNCAST(PreviewSpeedBar->GadgetWithId(APX_PPR_CURRPAGE), TTextGadget);
  181.   if (cpGadget) {
  182.     TAPointer<char> buffer = new char[32];
  183.  
  184.     if (Page2 && FromPage != ToPage)
  185.       sprintf(buffer, "Page %d - %d", FromPage, ToPage);
  186.     else
  187.       sprintf(buffer, "Page %d", FromPage);
  188.     cpGadget->SetText(buffer);
  189.   }
  190. }
  191.  
  192.  
  193. void TApxPreviewWin::PPR_PreviousEnable(TCommandEnabler& tce)
  194. {
  195. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  196.   // Only have previous on if we're not at the first page.
  197.   //
  198.   tce.Enable(FromPage != 1);
  199. }
  200.  
  201.  
  202. void TApxPreviewWin::PPR_NextEnable(TCommandEnabler& tce)
  203. {
  204. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  205.   // Only have next on if we're not at the last page.
  206.   //
  207.   TPrintDialog::TData& printerData = Printer->GetSetup();
  208.   tce.Enable(ToPage != printerData.MaxPage);
  209. }
  210.  
  211.  
  212. void TApxPreviewWin::PPR_Previous()
  213. {
  214.   TPrintDialog::TData& printerData = Printer->GetSetup();
  215.  
  216.   if (FromPage > printerData.MinPage) {
  217.     FromPage--;
  218.     ToPage--;
  219.  
  220.     Page1->SetPageNumber(FromPage);
  221.     if (Page2)
  222.       Page2->SetPageNumber(ToPage);
  223.   }
  224.  
  225.   SpeedBarState();
  226. }
  227.  
  228.  
  229. void TApxPreviewWin::PPR_Next()
  230. {
  231.   TPrintDialog::TData& printerData = Printer->GetSetup();
  232.  
  233.   if (ToPage < printerData.MaxPage) {
  234.     FromPage++;
  235.     ToPage++;
  236.  
  237.     Page1->SetPageNumber(FromPage);
  238.     if (Page2)
  239.       Page2->SetPageNumber(ToPage);
  240.   }
  241.  
  242.   SpeedBarState();
  243. }
  244.  
  245.  
  246. void TApxPreviewWin::PPR_OneUp()
  247. {
  248.   if (Page2) {
  249.     Client->RemoveChildLayoutMetrics(*Page2);
  250.  
  251.     delete Page2;
  252.     Page2 = 0;
  253.  
  254.     Client->Layout();
  255.  
  256.     ToPage = FromPage;
  257.  
  258.     SpeedBarState();
  259.   }
  260. }
  261.  
  262.  
  263. void TApxPreviewWin::PPR_TwoUpEnable(TCommandEnabler& tce)
  264. {
  265. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  266.   // Two up is only available for portrait mode.
  267.   //
  268.   tce.Enable(PrintExtent->cx <= PrintExtent->cy);
  269. }
  270.  
  271.  
  272. void TApxPreviewWin::PPR_TwoUp()
  273. {
  274.   if (!Page2) {
  275.     Page2 = new TPreviewPage(Client, *Printout, *PrnDC, *PrintExtent, PageNumber + 1);
  276.     Page2->Create();
  277.  
  278.     TLayoutMetrics metrics2;
  279.  
  280.     metrics2.X.Set(lmLeft, lmRightOf, Page1, lmRight, 30);
  281.     metrics2.Y.SameAs(Page1, lmTop);
  282.  
  283. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  284.     // Assume portrait
  285.     //
  286.     metrics2.Width.SameAs(Page1, lmWidth);
  287.     metrics2.Height.SameAs(Page1, lmBottom);
  288.  
  289.     Client->SetChildLayoutMetrics(*Page2, metrics2);
  290.     Client->Layout();
  291.  
  292.     TPrintDialog::TData& printerData = Printer->GetSetup();
  293.  
  294. ##--BEGIN-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
  295.     // Page 2 is the next page.  If the next page is outside of our range then
  296.     // set the first page back one and the 2nd page is the current page. If the
  297.     // document is only 1 page long then the 2nd page is empty.
  298.     //
  299. ##--END-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
  300.     if (FromPage == printerData.MaxPage) {
  301.       if (FromPage > 1) {
  302.         FromPage--;
  303.         ToPage = FromPage + 1;
  304.         Page1->SetPageNumber(FromPage);
  305.         Page2->SetPageNumber(ToPage);
  306.       }
  307.       else
  308.         Page2->SetPageNumber(0);
  309.     }
  310.     else {
  311.       ToPage = FromPage + 1;
  312.       Page2->SetPageNumber(ToPage);
  313.     }
  314.  
  315.     SpeedBarState();
  316.   }
  317. }
  318.  
  319.  
  320. void TApxPreviewWin::PPR_Done()
  321. {
  322. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  323.   // Don't call the base class EvClose; we do not want TApxPreviewWin to be destructed.
  324.   //
  325. ##@QUERY_APPL_MODEL == VALUE_SDI
  326.   GetApplication()->GetMainWindow()->SetRedraw(false);
  327.   GetApplication()->EndModal(IDCANCEL);
  328. }
  329.  
  330.  
  331. void TApxPreviewWin::EvClose()
  332. {
  333. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  334.   // Don't call the base class EvClose; we do not want TApxPreviewWin to be destructed.
  335.   //
  336. ##@QUERY_APPL_MODEL == VALUE_SDI
  337.   GetApplication()->GetMainWindow()->SetRedraw(false);
  338.   GetApplication()->EndModal(IDCANCEL);
  339. }
  340. ##--BEGIN-- @QUERY_APPL_MODEL == VALUE_MDI
  341.  
  342.  
  343. void TApxPreviewWin::CmPrint()
  344. {
  345.   TWindow* client = GetApplication()->GetMainWindow()->GetClientWindow();
  346.  
  347.   if (client)
  348.     client->SendMessage(WM_COMMAND, CM_FILEPRINT, 0);
  349. }
  350.  
  351.  
  352. void TApxPreviewWin::CmPrintEnable(TCommandEnabler& tce)
  353. {
  354.   tce.Enable(true);
  355. }
  356.  
  357. ##--END-- @QUERY_APPL_MODEL == VALUE_MDI
  358.